Analisi conversazioni Telegram

I dati possono essere scaricati in formato JSON dal client desktop di Telegram, andando in Settings - Export Telegram Data e selezionando Private Group (deselezionare Only my messages) e infine scegliendo il formato Machine-readable JSON.

Elenco delle chat disponibili:

for chat in datastore["chats"]["list"]:
    print(chat["name"])
Spam Nuarés
4K Magia Nell'Aria
I Lord(i) dello Spam
Montagna forever
Multinerdchat
FIFA18 Mundialito Edition
Il Gioco del Trono
Richiamo A.A.C.
Val Grande, Traversata Sud-Nord
Aiutino
Take my heart when you go
Parcheggio idee
Netflix Releases
Regali per la Francy, festeggiamenti 21 e 28 aprile
FIFA17 - Dexter Returns
Capodanno Craveggia
Capodanno Craveggia
Comunicazioni tecniche partita oggi
Parcheggio idee
Il Gioco del Trono
Giropasta
E3 2016
ChatMessages.tail()
action actor address date duration_seconds edited file forwarded_from from height ... reply_to_message_id sticker_emoji text thumbnail title type via_bot width day time
45444 NaN NaN NaN 2018-09-05 09:23:54 NaN 1970-01-01T01:00:00 NaN NaN Matteo NaN ... NaN NaN Quanti ottimi sticker nuovi NaN NaN message NaN NaN 2018-09-05 09:23:54
45445 NaN NaN NaN 2018-09-05 09:43:30 NaN 1970-01-01T01:00:00 NaN NaN Marta NaN ... NaN NaN 👍 NaN NaN message NaN NaN 2018-09-05 09:43:30
45446 NaN NaN NaN 2018-09-05 20:52:05 NaN 1970-01-01T01:00:00 NaN NaN Matteo NaN ... NaN NaN [{'type': 'link', 'text': 'https://youtu.be/EO... NaN NaN message NaN NaN 2018-09-05 20:52:05
45447 NaN NaN NaN 2018-09-05 20:52:34 NaN 1970-01-01T01:00:00 NaN NaN Matteo NaN ... NaN NaN 😂 ho appena provato con man... cioè con bocca ... NaN NaN message NaN NaN 2018-09-05 20:52:34
45448 NaN NaN NaN 2018-09-05 21:08:15 NaN 1970-01-01T01:00:00 NaN NaN Marco NaN ... NaN NaN [{'type': 'mention', 'text': '@crusholo', 'fro... NaN NaN message NaN NaN 2018-09-05 21:08:15

5 rows × 27 columns

Analisi

Totali per persona

Iniziamo a visualizzare il numero totale di messaggi per persona.

totali

Andamenti temporali

Per prima cosa mi piacerebbe riuscire a plottare numero di messaggi giornalieri di ogni persona. Usando .groupby('day','from').size() avremo le dimensioni.

andtemp

Distanza tra due messaggi consecutivi

pd.DataFrame(DeltaTimeStat).set_index('Nome')
Massima Media
Nome
Alessandra 26 days 12:33:36 1 days 07:17:44.395397
Francesca 5 days 20:20:52 0 days 04:45:40.399110
Giuseppe 4 days 14:02:58 0 days 04:54:42.255730
Luigi 56 days 16:33:38 6 days 20:07:45.452054
Marco 3 days 01:46:09 0 days 01:34:54.236883
Marta 6 days 13:30:23 0 days 04:33:53.682771
Matteo 2 days 02:36:48 0 days 01:27:20.662860
Riccardo 4 days 12:32:56 0 days 02:47:05.784798
Roberto 9 days 00:50:41 0 days 01:45:01.986931
Simone 53 days 14:14:54 2 days 11:45:05.326530
Stefano 12 days 21:04:42 0 days 10:43:57.606038

Creiamo lista che contiene i dizionari presenti nel field text del dataframe. Poi facciamo dataframe a partire da quella lista di dict.

link.tail()
from href text type user_id
1823 Matteo NaN https://scontent-mxp1-1.xx.fbcdn.net/v/t1.0-9/... link NaN
1824 Matteo NaN https://www.instagram.com/p/BnWU3VQBHe1/?utm_s... link NaN
1825 Marco NaN https://www.instagram.com/p/Bl8g-hegMUc/?utm_s... link NaN
1826 Matteo NaN https://www.instagram.com/p/BnWIj9FAtXt/?utm_s... link NaN
1827 Matteo NaN https://youtu.be/RW2t8xnwFfE link NaN

Menzioni

Per qualche motivo ci sono menzioni che hanno type mention e anche mention_name quindi serve unire in un unico dataframe i due gruppi, con pd.concat().

menzioni

Apprezziamo come Telegram riveli come il taggante salva in rubrica il taggato:

Creiamo colonna con i soli domini degli indirizzi, in modo che poi sia possibile raggruppare in base a questo parametro:

from collections import Counter
Counter(domini['dominio']).most_common(20)
[('www.instagram.com', 844),
 ('www.youtube.com', 194),
 ('www.facebook.com', 69),
 ('www.reddit.com', 24),
 ('www.imgur.com', 22),
 ('calciatoribrutti.com', 16),
 ('twitter.com', 14),
 ('www.amazon.it', 12),
 ('www.theverge.com', 12),
 ('streamable.com', 9),
 ('www.chiamarsibomber.com', 8),
 ('www.sportmediaset.mediaset.it', 7),
 ('www.metacritic.com', 7),
 ('www.engadget.com', 6),
 ('media.giphy.com', 5),
 ('shop.lego.com', 5),
 ('www.mondofox.it', 5),
 ('gfycat.com', 5),
 ('sport.sky.it', 5),
 ('goo.gl', 5)]

Instagram

Prendiamo solo quelli che fanno riferimento a instragram e interroghiamo le api di instragram per scoprire nome account della immagine linkata. Creiamo nuova colonna con questa informazione, raggruppiamo per autore messaggio e account instagram; selezioniamo un solo autore messaggio, ordiniamo per numero di occorrenze di account instragram e facciamo barplot. Inoltre per il plot non consideriamo gli HTTPError400.

FigInsta = plotinstaautore(insta,'Roberto')
plotinstaautore(insta,'Matteo')
plotinstaautore(insta,'Marco')

Distribuzioni orarie

Persone vs Ora

IDora

Persone verso Giorno Settimana

IDday

Giorni settimana verso Ora

totDayOra

Giorni settimana verso Ora - per singola persona

IDDayHour

Emoji

Classifica sticker più utilizzati:

FigSticker

Classifica emoji più utilizzati all'interno di messaggi di testo:

FigEmoji

World cloud

plt.figure(dpi=800)
plt.imshow(nuvola,interpolation="bilinear")
plt.axis("off")
plt.tight_layout()

Varie

print(f"Durata totale di messaggi audio/video: {ChatMessages['duration_seconds'].sum()} secondi")
Durata totale di messaggi audio/video: 4166.0 secondi